// c_variant_wrapper.cpp
#include <variant>
#include <cstring>
#include <cstdio>
#include <new>

// 定义支持的类型：int, float, const char*
using VariantType = std::variant<int, float, const char*>;

// 用于C语言的不透明指针（隐藏C++实现细节）
struct CVariant {
    VariantType var;
};

// 导出C接口（用extern "C"避免名字修饰）
extern "C" {
    // 创建变体对象
    CVariant* cvariant_create() {
        try {
            return new CVariant();
        } catch (const std::bad_alloc&) {
            return nullptr;
        }
    }

    // 销毁变体对象
    void cvariant_destroy(CVariant* var) {
        delete var;
    }

    // 设置int类型
    void cvariant_set_int(CVariant* var, int value) {
        if (var) var->var = value;
    }

    // 设置float类型
    void cvariant_set_float(CVariant* var, float value) {
        if (var) var->var = value;
    }

    // 设置字符串类型（注意：C++侧不管理字符串内存，需调用者保证生命周期）
    void cvariant_set_str(CVariant* var, const char* value) {
        if (var) var->var = value;
    }

    // 检查当前类型（返回类型标识：0=int, 1=float, 2=str, -1=错误）
    int cvariant_get_type(const CVariant* var) {
        if (!var) return -1;
        if (std::holds_alternative<int>(var->var)) return 0;
        if (std::holds_alternative<float>(var->var)) return 1;
        if (std::holds_alternative<const char*>(var->var)) return 2;
        return -1;
    }

    // 获取int值（类型不匹配时返回0，实际项目可加错误处理）
    int cvariant_get_int(const CVariant* var) {
        if (var && std::holds_alternative<int>(var->var)) {
            return std::get<int>(var->var);
        }
        fprintf(stderr, "cvariant: 类型错误（预期int）\n");
        return 0;
    }

    // 获取float值
    float cvariant_get_float(const CVariant* var) {
        if (var && std::holds_alternative<float>(var->var)) {
            return std::get<float>(var->var);
        }
        fprintf(stderr, "cvariant: 类型错误（预期float）\n");
        return 0.0f;
    }

    // 获取字符串值
    const char* cvariant_get_str(const CVariant* var) {
        if (var && std::holds_alternative<const char*>(var->var)) {
            return std::get<const char*>(var->var);
        }
        fprintf(stderr, "cvariant: 类型错误（预期字符串）\n");
        return nullptr;
    }
}